home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2007 January, February, March & April
/
Chip-Cover-CD-2007-02.iso
/
Pakiet bezpieczenstwa
/
mini Pentoo LiveCD 2006.1
/
mpentoo-2006.1.iso
/
livecd.squashfs
/
etc
/
hotplug
/
tape.agent
< prev
next >
Wrap
Text File
|
2006-05-01
|
7KB
|
252 lines
#!/bin/sh
###############################################################################
# Tape hotplug agent for Linux 2.4 kernels
#
# Copyright (c) 2002 IBM Development Germany, Boeblingen
#
# the GNU Public License applies
#
# Author: Stefan Bader <Stefan.Bader@de.ibm.com>, 2002
#
# History:
# 2002-10-14 Stefan Bader <Stefan.Bader@de.ibm.com>
# Fixed remove char case (missing statement)
# 2002-10-01 Stefan Bader <Stefan.Bader@de.ibm.com>
# Created inital version
#
# Generated by:
# /usr/src/linux/drivers/s390/char/tape.c
#
# Evionment:
# ACTION ::= add | remove
# DEVNO ::= <4 digit hex number>
# MAJOR ::= <dec major number>
# MINOR ::= <dec minor number>
# INTERFACE ::= char | block
###############################################################################
: ${ACTION?Bad invocation: \$ACTION is not set}
: ${DEVNO?Bad invocation: \$DEVNO is not set}
: ${MAJOR?Bad invocation: \$MAJOR is not set}
: ${MINOR?Bad invocation: \$MINOR is not set}
: ${INTERFACE?Bad invocation: \$INTERFACE is not set}
# Convert to lowercase (just in case)
DEVNO=$(echo $DEVNO | tr A-F a-f)
cd /etc/hotplug
. hotplug.functions
mesg "$ACTION $DEVNO $MAJOR $MINOR $INTERFACE"
if test -r tape.permissions; then
. tape.permissions
else
mesg "Tape permission handling not found"
exit 1
fi
#==============================================================================
# To preserve the script from doing anything real, call it with
# CONDOM=echo
: ${CONDOM=}
# To try things on an alternate location set ROOTDIR to a different base
#: ${ROOTDIR=}
: ${ROOTDIR=}
# Abort on error or unset variables:
set -o errexit
set -o nounset
#==============================================================================
#------------------------------------------------------------------------------
# Environment: none
# Parameters : $1 : abort message
# $2 : optional return code
#------------------------------------------------------------------------------
# Abort handling
abort() {
if test "$#" -lt 2; then
RC=1
else
RC=$2
fi
mesg "$1 RC($RC)"
exit $RC
}
#------------------------------------------------------------------------------
# Environment: INTERFACE
# MINOR
# Parameters: none
#
# Prints: Tape number [0..127]
# Returns: 0
#------------------------------------------------------------------------------
tape_number() {
if test "$INTERFACE" = "block"; then
echo $MINOR
else
echo "$(($MINOR / 2))"
fi
return 0
}
#------------------------------------------------------------------------------
# Environment: ROOTDIR
# DEVNO
# CONDOM
# Parameters: $1 : variable part of the link name
# $2 : variable part of the target node name
#
# Creates a symbolic link to access the tape device by devno
#
# Prints: nothing
# Returns: 0 on success, otherwise 1
#------------------------------------------------------------------------------
create_symlink() {
LINK=$ROOTDIR/dev/tape/$DEVNO/$1
TARGET=../../../$2$(tape_number)
# Do not create link if devfs compatibility mode is not started
if test ! -d $ROOTDIR/dev/tape; then
return 0
fi
if test ! -d $(dirname $LINK); then
$CONDOM mkdir -p $(dirname $LINK) || return 1
fi
mesg "Creating symlink $LINK -> $TARGET"
$CONDOM rm -f $LINK || return 1
$CONDOM ln -s $TARGET $LINK || return 1
return 0
}
#------------------------------------------------------------------------------
# Environment: MAJOR
# MINOR
# Parameters: $1 : node name
# $2 : device type (b|c)
#
# Tests whether the node already exists with the correct type, major and minor
#
# Prints: nothing
# Returns: 0 if the node is ok, otherwise 1
#------------------------------------------------------------------------------
verify_node() {
NAME="$1"
TYPE="$2"
RC=1
if test -$TYPE "$NAME"; then
MAJMIN=$(ls -l "$NAME"|awk '{print $5 $6}')
if test "$(echo $MAJMIN|cut -d, -f1)" = "$MAJOR"; then
if test "$(echo $MAJMIN|cut -d, -f2)" = "$MINOR"; then
RC=0
fi
fi
fi
return $RC
}
#------------------------------------------------------------------------------
# Environment: ROOTDIR
# INTERFACE
# CONDOM
# MAJOR
# MINOR
# OWNER
# PERMISSIONS
# Parameters: $1 : device type (b|c)
# $2 : variable part of the device node name ([brn]tibm)
#
# Creates a device node for the tpae device (if it doesn't exist) and sets
# the permissions.
#
# Prints: nothing
# Returns: 0 on success, otherwise 1
#------------------------------------------------------------------------------
create_node() {
TYPE="$1"
NAME="$ROOTDIR/dev/$2$(tape_number)"
# FIXME: This would currently recreate the device node if it isn't
# right even if devfs compatibility isn't enabled. Should
# ownership and permissions be preserved in that case???
if ! verify_node $NAME $TYPE; then
mesg "Creating devicenode $NAME"
$CONDOM rm -f "$NAME" || return 1
$CONDOM mknod "$NAME" $TYPE $MAJOR $MINOR || return 1
fi
# We only want to change ownership and permissions if devfs compa-
# tibility is enabled.
tape_permissions $DEVNO
if test "$OWNER" != "" && test -d $ROOTDIR/dev/tape; then
$CONDOM chown $OWNER "$NAME" || return 1
if test "$PERMISSIONS" != ""; then
$CONDOM chmod "$PERMISSIONS" "$NAME" || return 1
fi
fi
return 0
}
#------------------------------------------------------------------------------
# Main
#------------------------------------------------------------------------------
case "$ACTION" in
add)
case "$INTERFACE" in
block)
create_node b btibm || return 1
create_symlink block/disc btibm || return 1
;;
char)
create_node c ntibm || return 1
create_symlink char/norewind ntibm || return 1
MINOR=$(($MINOR + 1))
create_node c rtibm || return 1
create_symlink char/rewind rtibm || return 1
;;
*)
abort "Unknown interface type <$INTERFACE>"
;;
esac
;;
remove)
case "$INTERFACE" in
char)
$CONDOM rm -rf $ROOTDIR/dev/tape/$DEVNO/char
if test -d $ROOTDIR/dev/tape; then
$CONDOM rm -f \
$ROOTDIR/dev/[nr]tibm$(tape_number)
fi
;;
block)
$CONDOM rm -rf $ROOTDIR/dev/tape/$DEVNO/block
if test -d $ROOTDIR/dev/tape; then
$CONDOM \
rm -f $ROOTDIR/dev/btibm$(tape_number)
fi
;;
*)
abort "Unknown interface type <$INTERFACE>"
;;
esac
if test "$(ls $ROOTDIR/dev/tape/$DEVNO)" = ""; then
$CONDOM rmdir $ROOTDIR/dev/tape/$DEVNO
fi
;;
*)
abort "$(basename $0): $ACTION event not supported"
;;
esac
exit 0